package main

import (
	"log"
	"time"
        "fmt"
	"github.com/streadway/amqp"
)

const (
	rabbitMQURL = "amqp://user:password@172.16.168.58:5672/" // 保持与生产者相同的配置
	queueName   = "imgdesc"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}
func main() {
	// 1. 连接到RabbitMQ服务器
	var sn int
	conn, err := amqp.Dial(rabbitMQURL)
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	// 3. 声明持久化队列（参数必须与生产者一致）
	q, err := ch.QueueDeclare(
		queueName, // 队列名称
		true,      // 持久化队列
		false,     // 自动删除
		false,     // 排他队列
		false,     // 无等待
		nil,
	)
	failOnError(err, "Failed to declare a queue")

	// 4. 设置QoS（公平分发）
	err = ch.Qos(
		1,     // 每次预取的消息数量
		0,     // 预取窗口大小（0表示无限制）
		false, // 是否全局应用
	)
	failOnError(err, "Failed to set QoS")

	// 5. 消费消息
	msgs, err := ch.Consume(
		q.Name, // 队列名称
		"",     // 消费者标签
		false,  // 关闭自动应答（需手动确认）
		false,  // 排他性
		false,  // 不等待
		false,  // 额外参数
		nil,
	)
	failOnError(err, "Failed to register a consumer")

	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")

	// 6. 持续处理消息
	for d := range msgs {
		log.Printf("Received a message: %s", d.Body)
		log.Printf("Message Timestamp: %s", d.Timestamp.Format(time.RFC3339))
		fmt.Println(time.Now(),"当前记录为 ",sn) 
		sn++

		// 模拟消息处理耗时
		time.Sleep(1 * time.Millisecond)

		// 手动确认消息
		d.Ack(false)
	}
}

